
int get_size() { return 512; }

constexpr int size() { return 512; }

// i 和 j 都必须定义在函数体外
int j = 0;
constexpr int i = 42;                   // i 的类型是整型常量

int main()
{
    const int max_files = 20;           // max_files 是常量表达式
    const int limit = max_files + 1;    // limit 是常量表达式
    int staff_size = 27;                // staff_size 不是常量表达式
    const int sz = get_size();          // sz 不是常量表达式

    constexpr int mf = 20;              // 20 是常量表达式
    constexpr int limit2 = mf + 1;      // mf + 1 是常量表达式
    constexpr int sz2 = size();         // 只有当 size 是一个 constexpr 函数时
                                        // 才是一条正确的声明语句

    // 只有字面值类型才能被定义成 constexpr

    const int *p = nullptr;             // p 是一个指向整型常量的指针
    constexpr int *q = nullptr;         // q 是一个指向整数的常量指针

    constexpr int *np = nullptr;        // np 是一个指向整数的常量指针，其值为空
    
    constexpr const int *p2 = &i;       // p2 是常量指针，指向整型常量 i
    constexpr int *p3 = &j;             // p3 是常量指针，指向整数 j
}